package handler

import (
	"net/http"

	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/service"
	"github.com/gin-gonic/gin"
)

// GameHandler 处理游戏相关请求的控制器
// 这个结构体持有gameService接口，用于调用游戏业务逻辑
type GameHandler struct {
	gameService service.GameService
}

// NewGameHandler 创建一个新的游戏控制器实例
// 参数gameService是游戏服务接口，用于注入依赖
func NewGameHandler(gameService service.GameService) *GameHandler {
	return &GameHandler{
		gameService: gameService,
	}
}

// StartCultivation 处理开始修炼请求
// 这个方法让用户开始修炼，增加修为值
func (h *GameHandler) StartCultivation(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	userId := int64(1)

	// 定义请求体结构体
	type CultivationRequest struct {
		Duration int `json:"duration" binding:"required,min=1,max=24"` // 修炼时长（小时）
	}

	var req CultivationRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": "参数验证失败",
			"error": err.Error(),
		})
		return
	}

	// 调用Service层处理修炼逻辑
	result, err := h.gameService.StartCultivation(userId, req.Duration)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": err.Error(),
		})
		return
	}

	// 返回修炼结果
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "修炼完成",
		"data": result,
	})
}

// GetGameStatus 处理获取游戏状态请求
// 这个方法返回用户当前的游戏状态信息
func (h *GameHandler) GetGameStatus(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	userId := int64(1)

	// 调用Service层查询用户游戏状态
	status, err := h.gameService.GetGameStatus(userId)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": err.Error(),
		})
		return
	}

	// 返回游戏状态
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": "success",
		"data": status,
	})
}

// BreakthroughRealm 处理境界突破请求
// 这个方法让用户尝试突破当前境界
func (h *GameHandler) BreakthroughRealm(c *gin.Context) {
	// TODO: 在实际项目中，这里应该从JWT令牌中获取用户ID
	userId := int64(1)

	// 调用Service层处理境界突破逻辑
	result, err := h.gameService.BreakthroughRealm(userId)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"message": err.Error(),
		})
		return
	}

	// 返回突破结果
	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"message": result.Message,
		"data": result,
	})
}